`timescale 1ns / 1ps
/*--------------------------------------------------------------------*\
FileName        : cbb_tik_sec.v
Author          ：hpy
Email           ：yuan_hp@qq.com
Date            ：2022年08月25日
Description     ：秒计数器,每秒加1,只到寄存器到最大值停止

cbb_tik_sec #(
    .fclk(148148163 ),  // 系统时钟频率 Hz
    .dw( 32 ) // 秒计数器位宽 
) tik_sec_u1 (
    .i_clk( ),
    .i_rst_n(),
    .o_sec() 
);
\*--------------------------------------------------------------------*/
module cbb_tik_sec #(
    parameter fclk = 148148163 ,  // 系统时钟频率 Hz
    parameter dw  = 32  // 秒计数器位宽 
)(
    input i_clk,
    input i_rst_n,
    output reg [dw-1:0] o_sec 
);

function integer clog2(input integer i) ; 
    for( clog2 =0 ; i>0 ; clog2 = clog2 + 1) 
        i = i>>1 ; 
endfunction 

localparam N = $clog2( fclk ) ; 
reg [N-1 : 0 ] clkcnt ; 


always @( posedge i_clk ) begin
    if( i_rst_n == 1'b0 ) begin 
        clkcnt <=  fclk - 1'b1 ; 
    end else begin 
        clkcnt <= (~|clkcnt) ? fclk - 1'b1  : clkcnt - 1'b1 ; 
    end 
end


always @(posedge i_clk ) begin 
    if( i_rst_n == 1'b0 ) 
        o_sec <= {dw{1'b0}} ; 
    else 
        o_sec <= (~|clkcnt) ? o_sec +1'b1 : o_sec ; 
end 


`ifdef  CBB_SIM 
`include "cbb_sim.v"
initial begin 
    forever begin
        @(posedge i_clk )begin 
            if( ~|clkcnt)`CBB_SIM_LOG((" o_sec=%0d",clkcnt,o_sec)) ;
        end
    end
end
`endif 



endmodule

